#!/usr/bin/env node

/**
 * 修复全局加载方法结构问题的脚本
 * 检查并修复页面中错误放置在 data 对象内的全局加载方法
 */

const fs = require('fs');
const path = require('path');

// 需要检查的页面目录
const pagesDir = path.join(__dirname, '../pages');

// 递归查找所有页面文件
function findPageFiles(dir) {
  const files = [];
  const items = fs.readdirSync(dir);
  
  for (const item of items) {
    const fullPath = path.join(dir, item);
    const stat = fs.statSync(fullPath);
    
    if (stat.isDirectory()) {
      files.push(...findPageFiles(fullPath));
    } else if (item === 'index.js') {
      files.push(fullPath);
    }
  }
  
  return files;
}

// 检查文件是否有全局加载方法结构问题
function hasGlobalLoadingStructureIssue(content) {
  // 检查是否有在 data 对象内定义的方法
  const dataMethodPattern = /data:\s*\{[\s\S]*?showGlobalLoading\s*\([^)]*\)\s*\{[\s\S]*?\}[\s\S]*?\}/;
  return dataMethodPattern.test(content);
}

// 修复全局加载方法结构
function fixGlobalLoadingStructure(filePath) {
  try {
    let content = fs.readFileSync(filePath, 'utf8');
    let modified = false;
    
    // 检查是否有问题
    if (!hasGlobalLoadingStructureIssue(content)) {
      console.log(`⏭️  无需修复: ${filePath}`);
      return false;
    }
    
    console.log(`🔧 正在修复: ${filePath}`);
    
    // 提取 data 对象内的全局加载相关方法
    const dataObjectPattern = /data:\s*\{([\s\S]*?)\}/;
    const match = content.match(dataObjectPattern);
    
    if (!match) {
      console.log(`❌ 无法找到 data 对象: ${filePath}`);
      return false;
    }
    
    const dataContent = match[1];
    
    // 提取全局加载相关的方法和属性
    const globalLoadingPattern = /(\s*\/\/\s*全局加载状态[\s\S]*?globalLoadingText:\s*'[^']*'[\s\S]*?)(\s*\/\/\s*显示全局加载[\s\S]*?showGlobalLoading\s*\([^)]*\)\s*\{[\s\S]*?\}[\s\S]*?)(\s*\/\/\s*隐藏全局加载[\s\S]*?hideGlobalLoading\s*\([^)]*\)\s*\{[\s\S]*?\}[\s\S]*?)(\s*\/\/\s*更新全局加载状态[\s\S]*?updateGlobalLoading\s*\([^)]*\)\s*\{[\s\S]*?\}[\s\S]*?)/;
    
    const globalLoadingMatch = dataContent.match(globalLoadingPattern);
    
    if (!globalLoadingMatch) {
      console.log(`❌ 无法找到全局加载方法: ${filePath}`);
      return false;
    }
    
    const [, stateProps, showMethod, hideMethod, updateMethod] = globalLoadingMatch;
    
    // 从 data 内容中移除全局加载方法
    const cleanedDataContent = dataContent.replace(globalLoadingPattern, '');
    
    // 构建新的 data 对象
    const newDataObject = `data: {${cleanedDataContent}}`;
    
    // 在 data 对象后添加方法
    const methodsToAdd = `
  ${showMethod.trim()}

  ${hideMethod.trim()}

  ${updateMethod.trim()}

`;
    
    // 替换整个 data 对象并添加方法
    const newContent = content.replace(dataObjectPattern, newDataObject + methodsToAdd);
    
    // 写入文件
    fs.writeFileSync(filePath, newContent, 'utf8');
    
    console.log(`✅ 已修复: ${filePath}`);
    return true;
    
  } catch (error) {
    console.error(`❌ 修复失败: ${filePath}`, error.message);
    return false;
  }
}

// 主函数
function main() {
  console.log('🔍 开始检查全局加载方法结构问题...\n');
  
  const pageFiles = findPageFiles(pagesDir);
  let fixedCount = 0;
  
  for (const filePath of pageFiles) {
    if (fixGlobalLoadingStructure(filePath)) {
      fixedCount++;
    }
  }
  
  console.log(`\n📊 修复完成！共修复了 ${fixedCount} 个文件`);
}

// 运行脚本
if (require.main === module) {
  main();
}

module.exports = {
  findPageFiles,
  hasGlobalLoadingStructureIssue,
  fixGlobalLoadingStructure
};
